package cloudsync

import (
	"context"
	"devops/src/common"
	"sync"
	"time"

	"github.com/go-kit/log"
	"github.com/go-kit/log/level"
)

// 资源同步接口，必须有sync 方法

type CloudResource interface {
	sync()
}

type CloudAlibaba struct {
}

type CloudTencent struct {
}

// 接口容器 ，承载的是多个资源的同步接口{名称：接口}
// 新增资源时，更新注册方法即可
var (
	cloudResourceContainer = make(map[string]CloudResource)
)

// 资源注册，只要传入名称和符合接口的一个资源。就会放到容器中
func cRegister(name string, cr CloudResource) {
	cloudResourceContainer[name] = cr
}

func Init(logger log.Logger) {
	hs := &HostSync{
		//资源和表的对应关系
		TableName: common.RESOURCE_HOST,
		Logger:    logger,
	}
	cRegister(common.RESOURCE_HOST, hs)
}

// 管理接口容器的管理端，如何管理呢
func CloudSyncManager(ctx context.Context, logger log.Logger) error {

	level.Info(logger).Log("msg", "CloudSyncManager.start", "resource_num", len(cloudResourceContainer))
	ticker := time.NewTicker(15 * time.Second)
	// 启动一个定时任务，每15秒执行一次，真正干活的
	//为什么底下有了这里还要写，避免等待15s钟
	doCloudSync(logger)
	defer ticker.Stop()
	for {
		select {
		case <-ctx.Done():
			level.Info(logger).Log("msg", "CloudSyncManager.exit.receive_quit_signal", "resource_num", len(cloudResourceContainer))
			return nil
		case <-ticker.C:
			level.Info(logger).Log("msg", "doCloudSync.cron", "resource_num", len(cloudResourceContainer))

			doCloudSync(logger)
		}
	}

}

// 遍历他，进行sync
func doCloudSync(logger log.Logger) {
	var wg sync.WaitGroup
	wg.Add(len(cloudResourceContainer))
	for _, sy := range cloudResourceContainer {
		sy := sy
		go func() {
			defer wg.Done()
			sy.sync()
		}()
	}
	wg.Wait()
}
